﻿using System.Globalization;
using System.Reflection;
using System.Resources;
using System.Threading;
using System.Windows;
using System.Windows.Threading;
using System;

namespace DocBot
{
	// splash Startup logic
	// http://blog.klaus-b.net/post/2008/03/17/WPF-Anwendung-mit-Splash-Screen.aspx
	/// <summary>
	/// Anwendungsweiter Delegat zum aktualisieren der UI-Elemente auf dem UI-Thread.
	/// </summary>
	/// <remarks>Wird benötigt um Cross-Threading Situationen zu vermeiden.</remarks>
	internal delegate void Invoker();

	/// <summary>
	/// Interaktionslogik für "App.xaml"
	/// </summary>
	/// <remarks>
	/// Lädt einen SplashScreen während zeitintensive Resourcen geladen werden.
	/// Nach Abschluss des ladens wird die Hauptanwendung angezeigt und der
	/// SplashScreen geschlossen.
	/// </remarks>
	public partial class App : Application
    {
		#region internal Delegates

		/// <summary>
		/// Delegate zum initialisieren der SplashScreen-Klasse.
		/// </summary>
		/// <param name="splashScreen">Eine Instanz der SplashScreen-Klasse.</param>
		/// <remarks>n/a</remarks>
		internal delegate void ApplicationInitializeDelegate(SplashWindow splashScreen);

		#endregion

		#region Internal Fields

		/// <summary>
		/// Hält eine Instanz des ApplicationInitializeDelegate.
		/// </summary>
		/// <remarks>Die Methode wird im Konstruktor der Klasse an den Delegaten übergeben.</remarks>
		internal ApplicationInitializeDelegate ApplicationInitialize;

		/// <summary>
		/// Hält den Stammnamen der Resourcen für die aktuelle Anwendung.
		/// </summary>
		/// <remarks>Der Namespace wird mittels Reflection ermittelt.</remarks>
		internal static string resourceBaseName = typeof(App).Namespace + ".Properties.Resources";

		/// <summary>
		/// Hält den ResourcenManager für den Zugriff auf lokalisierbare Resourcen.
		/// </summary>
		/// <remarks>Wird für evtl. spätere lokalisierung verwendet.</remarks>
		internal static ResourceManager resourceManager =
				new ResourceManager(resourceBaseName, Assembly.GetExecutingAssembly());

		/// <summary>
		/// Hält die Kultur unter der die Anwendung ausgeführt wird.
		/// </summary>
		/// <remarks>Wird für evtl. spätere lokalisierung verwendet.</remarks>
		internal static CultureInfo currentCulture = CultureInfo.CurrentCulture;

		#endregion

		#region Properties

		/// <summary>
		/// Gibt die aktuelle AppDomain als Instanz der App-Klasse zurück.
		/// </summary>
		/// <value>Eine Instanz der App-Klasse.</value>
		/// <remarks>Wird benötigt um auf den ApplicationInitialize Delegaten zugreifen zu können.</remarks>
		public static new App Current
		{
			get { return Application.Current as App; }
		}

		#endregion

		#region Construtors

		/// <summary>
		/// Initialisiert eine neue Instanz der App-Klasse.
		/// </summary>
		/// <remarks>Parameterloser Standard-Konstruktor.</remarks>
		public App()
		{
			// Die Initialisierungs-Methode an den Delegaten übergeben.
			ApplicationInitialize = applicationInitialize;
		}

		#endregion

		#region Methods

		/// <summary>
		/// Lädt die SplashScreen- und Window1-Klasse und stellt die Interaktionslogik
		/// für das UI der SplashScreen-Klasse.
		/// </summary>
		/// <param name="splashScreen">Eine Instanz der SplashScreen-Klasse</param>
		/// <remarks>Wird in einer Instanz des ApplicationInitializeDelegate verarbeitet.</remarks>
		private void applicationInitialize(SplashWindow splashScreen)
		{
			// Statustexte zur Ausgabe im Ladestatus zuweisen
			string msg1 = resourceManager.GetString("splash_Msg1", currentCulture);
			string msg2 = resourceManager.GetString("splash_Msg2", currentCulture);
			string msg3 = resourceManager.GetString("splash_Msg2", currentCulture);

			#region Load Resources
			// Hier Lade-Logik implementieren

			// Erste Nachricht ausgeben und ProgressBar auf 20% setzen
			//splashScreen.SetProgress(20, msg1);

			//// zum simulieren 2 Sekunden Pause
			//Thread.Sleep(TimeSpan.FromSeconds(3));

			//// ProgressBar auf 80% setzen
			//splashScreen.SetProgress(80);

			//// simulieren weiterer Ladevorgänge
			//Thread.Sleep(TimeSpan.FromSeconds(2));

			//// letze Meldung ausgeben und ProgressBar auf 100% setzen
			//splashScreen.SetProgress(100, msg3);

			//// laden beendet, Cancel-Button disablen
			//splashScreen.DisableCancelButton();
			// kurze Pause zur Ausgabe
			//Thread.Sleep(500);

			#endregion

			// Initialisierung abgeschlossen, Hauptfenster laden
			Dispatcher.BeginInvoke(DispatcherPriority.Normal, (Invoker)delegate
			{
				// hier können auch Überladungen verwendet werden,
				// um z.B. in dieser Klasse geladene Resourcen im
				// Window1-Konstruktor zu übergeben.
				MainWindow mainWindow = new MainWindow();
				mainWindow.Show();
			});
		}

		#endregion
	}
}
